import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';

// 创建 Axios 实例
const instance = axios.create({
    baseURL: process.env.NEXT_PUBLIC_API_BASE_URL, // 全局请求域名
    timeout: 30000, // 超时时间（毫秒）
    headers: {
        'Content-Type': 'application/json', // 默认请求头
    },
});

// 定义通用的请求和响应数据接口
interface ApiResponse<T = any> {
    success: boolean;
    code: number;
    data?: T;
    msg?: string;
}

// 请求拦截器
instance.interceptors.request.use(
    (config: AxiosRequestConfig) => {
        // 在发送请求之前做些什么，例如添加 token
        const token = localStorage.getItem('token'); // 假设 token 存储在 localStorage 中
        if (token && config.headers) {
            config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        console.error('Request Error:', error);
        return Promise.reject(error);
    }
);

// 响应拦截器
instance.interceptors.response.use(
    (response: AxiosResponse<ApiResponse>) => {
        // 对响应数据做点什么
        if (!response.data.code == "200" && !response.data.code == 200) {
            console.error('API Error:', response.data.msg);
        }
        return response.data; // 直接返回响应数据
    },
    (error) => {
        // 对响应错误做点什么
        console.error('Response Error:', error);
        if (error.response) {
            // 服务器返回了错误状态码
            const { status } = error.response;
            if (status === 401) {
                console.warn('Unauthorized: Token expired or invalid.');
                // 可以在这里触发登出逻辑或跳转到登录页面
            } else if (status === 403) {
                console.warn('Forbidden: You do not have permission to access this resource.');
            } else if (status >= 500) {
                console.error('Server Error: Internal server error.');
            }
        } else if (error.request) {
            // 请求已发出，但未收到响应
            console.error('No response received from the server.');
        } else {
            // 其他错误
            console.error('Error setting up the request:', error.message);
        }
        return Promise.reject(error);
    }
);

// 导出封装的方法
export const httpGet = async <T = any>(
    url: string,
    config?: AxiosRequestConfig
): Promise<ApiResponse<T>> => {
    return instance.get(url, config);
};

export const httpPost = async <T = any>(
    url: string,
    data?: any,
    config?: AxiosRequestConfig
): Promise<ApiResponse<T>> => {
    return instance.post(url, data, config);
};

export const httpPut = async <T = any>(
    url: string,
    data?: any,
    config?: AxiosRequestConfig
): Promise<ApiResponse<T>> => {
    return instance.put(url, data, config);
};

export const httpDelete = async <T = any>(
    url: string,
    config?: AxiosRequestConfig
): Promise<ApiResponse<T>> => {
    return instance.delete(url, config);
};

// 导出原始实例（如果需要更灵活的使用）
export default instance;